Docker 核心概念和分层机制

1 Docker 核心概念

Docker 有三个核心概念,分别是:

  1. 镜像(Image)。
  2. 容器(Container)。
  3. 仓库(Repository)。

1.1 Docker 镜像

  1. Docker 镜像类似于虚拟机镜像,可以简单理解为一个模板。
  2. Docker 镜像是创建Docker容器的基础。
  3. 通过版本管理和增量的文件系统,非常简便创建和更新 Docker 镜像
  4. 用户可以直接从网络上下载一个做好的 Docker 镜像

1.2 Docker 容器

1、Docker 容器和沙箱很相似,容器拥有独立的、隔离的虚拟 Linux 环境。
2、容器可以看做是一个简易版的 Linux 系统环境。
3. 下图是 Docker 容器Docker 镜像 之间的关系图。

MyApplication
MyApplication
MyApplication
V2层
MyApplication...
Debian 层:
/bin
/boot
...
/tmp
/var
Debian 层:...
运行中的进程
运行中的进程
运行中的进程
运行中的进程
Docker宿主机
Docker宿主机
MyApplication
容器(v2) 1
MyApplication...
MyApplication
容器(v2) 2
MyApplication...
MyApplication
容器(v1) 3
MyApplication...
MyApplication
容器(v2) 1
MyApplication...
镜像:镜像是文件系统层和一些元数据的集合。他们合在一起,以Docker容器的形式运行。
镜像:镜像是文件系统层和一些元数据的集合。他们合在一起,以Docker容器的形式运行。
层:层是文件变更的合集。
MyApplication V1 与V2 的不同之处保存在这个层里。
层:层是文件变更的合集。MyApplication V1 与V2 的不同之处保存在这个层里。
容器:容器是镜像的运行实例。可以使用同一个镜像运行多个容器。
容器:容器是镜像的运行实例。可以使用同一个镜像运行多个容器。
Text is not SVG - cannot display

1.3 Docker 仓库

  1. Docker 仓库类似代码仓库,可以集中存放镜像文件。
  2. Docker 仓库仓库注册服务器
    • 仓库注册服务器是存放仓库的位置。
    • 一个注册服务器存放这多个仓库。‘

3、例如存放 Ubuntu 操作系统的镜像仓库称为 Ubuntu 仓库,其中包含 14.04 、12.04 等不同版本的进项。

注册服务器
注册服务器
14.04
14.04
12.04
12.04
13.10
13.10
5.0
5.0
6.0
6.0
7.0
7.0
Ubuntu仓库
Ubuntu仓库
CentOS 仓库
CentOS 仓库
Text is not SVG - cannot display

4、根据镜像是否分享,Docker 仓库可以分为公开仓库(public)私有仓库(private)
5、最大的公开仓库是官方提供的 Docker Hub
6、国内网易云也提供了仓库的本地化。

Note

Docker 仓库管理镜像与GIT 非常相似。

2 Docker 的分层机制

Docker 分层机制能够大大提高容器的启动速度。

  1. Docker 运行容器时,会使用写时复制机制(copy-on-write)减少所需的硬盘空间。
  2. 当一个运行的容器需要写入一个文件时,将该文件复制到磁盘的一个新区域。
  3. 在执行Docker 提交时,将会把这块磁盘的区域冻结并记录为自身标识符的一个层。
在一个不分层的应用程序的9个运行实例会在磁盘上生成9个副本。
在一个不分层的应用程序的9个运行实例会在磁盘上生成9个副本。
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
to-do 应用
启动容器时复制层(copy-on-startup)
启动容器时复制层(copy-on-startup)
每一个块表示一个运行中的容器与原始to-do 应用的镜像的文件差异。使用的磁盘空间更少。
每一个块表示一个运行中的容器与原始to-do 应用的镜像的文件差异。使用的磁盘空间更少。
Text
Text
to-do应用
to-do应用
写时复制(Copy-on-wirite) 层
写时复制(Copy-on-wirite) 层
Text is not SVG - cannot display

2.1 什么是写时复制

  1. 写时复制时计算机技术中使用的一种标准的优化策略。
  2. 从一个镜像创建一个新的容器时,当数据发生变化时才复制一一个层,而不是复制整个所需的数据集。
  3. 这样能够节省很多磁盘空间。

2.2 什么是层?

  1. 层是指一些变化的块的合集。
  2. 层是静态的,所以用户只需要在引用的镜像上构建。
  3. 以下图示说明了我们可以从公开可用的 node 镜像构建,并将变更的内容放在最上层。
名称:todoapp
镜像ID:bd092d1
大小:600KB
名称:todoapp...
名称:node
镜像ID:efc12dea
大小:1.5 MB
名称:node...
名称:centos
镜像ID:abcf13de
大小:89MB
名称:centos...
基础的Centos层包含了发行的标准基础包
基础的Centos层包含了发行的标准基础包
Node.js 程序和文件被添加到这一层。
Node.js 程序和文件被添加到这一层。
顶层的to-do 应用程序
顶层的to-do 应用程序
3层一起组成了这个to-do 镜像。
3层一起组成了这个to-do 镜像。
镜像ID 是镜像的唯一引用。
镜像ID 是镜像的唯一引用。
Text is not SVG - cannot display
  1. 上面的三层都可以被多个容器所共享,就像共享内存能够被多个进程访问。
  2. 这样可以再本地机器上启动多个不同的环境。能够运行更多的容器从而保证磁盘空间不会被大量消耗。